package basic

import "fmt"
/**
 结构体默认是值类型
 nil 指针也能调用方法
 nil是安全的指针
 */


type TreeNode struct {
	left,right *TreeNode
	value int
}

// 遍历tree
func (tree *TreeNode) Bl()  {
	if tree == nil{
		fmt.Println("nil")
	} else {
		fmt.Println(tree.value)
	}
}

func (tree *TreeNode) tv()  {
	if tree == nil{
		return
	} else {
		tree.left.tv()
		fmt.Println(tree.value)
		tree.right.tv()
	}
}

func (tree *TreeNode) setTreeNodeValue()  {
	tree.value = 888
}
// 如接收者有指针类型接受者，建议所有的方法都定义指针类型接受者，如果是指针类型接受者 外边必须 &{} 如果是值类型接受者 &{} {}都行
func createFacTreeNode(value int) *TreeNode  {
	return &TreeNode{
		value: value,
	}
}

func Structs()  {

	lk := createFacTreeNode(22)

	// 仅仅申请地址空间
	d := new(TreeNode)

	a := TreeNode{
		left: d, // 默认没有直接用nil
		right: lk,
		value: 1,
	}

	b := TreeNode{
		nil,
		nil,
		2,
	}



	top := &TreeNode{
		left: &a,
		right: &b,
		value: 0,
	}

	top.setTreeNodeValue()
	top.Bl()
	top.tv()

	// 只声明不赋值默认是nil
	var ts *TreeNode
	//fmt.Println(ts.value) // 调用属性不行没有开辟空间 调用方法可以使用判断做拦截
	// nil指针调用方法
	ts.Bl()

	nodes := []TreeNode{
		{
			value: 3,
		},
		{

		},
		{
			nil,
			nil,
			32,
		},
	}


	fmt.Println(top.left.right,nodes)
}
